#include "../inc/dir.h"
#include "../inc/dlist.h"

//检测账号是否已经存在 (注册时)
int dir_is_user_exist(FILE *fp, const char *username ) {  //1账号存在  0账号不存在
    ACCOUNT_PASSWORD_t user;  
    rewind(fp); // 重置文件指针到文件开始  
    while (fscanf(fp, "%s %s", user.account_pri, user.password_pri) == 2) {  
        if (strcmp(user.account_pri, username) == 0) {  
            return 1; // 账号已存在  
        }  
    }  
    return 0; // 账号不存在  
}  

//检测账号是否已经存在 (注册时)
int dir_user_exist_list(DNode_t*head,const char *username){
    ACCOUNT_PASSWORD_t user;
    strcpy(user.account_pri,username);
    if(list_find_duplicate_account(head,user)){
        //找到了
        return 1;
    }else{
        //没找到
        return 0;
    }
}

// 注册新用户  
void dir_register_user(const char *filename, const char *username, const char *password) {  
    FILE *fp = fopen(filename, "a");  
    if (!fp) {  
        perror("Error opening file");  
        exit(EXIT_FAILURE);  
    }  
  
    if (dir_is_user_exist(fp, username)) {  
        printf("Username already exists.\n");  
    } else {  
        fprintf(fp, "%s %s\n", username, password);  
        printf("Registration successful.\n");  
    }  
  
    fclose(fp);  
}  

// 用户登录 (检车是否有账号密码一样的)
int dir_login_user(const char *filename, const char *username, const char *password) {  
    FILE *fp = fopen(filename, "r");  
    if (!fp) {  
        perror("Error opening file");  
        return 0; // 登录失败  
    }  
  
    ACCOUNT_PASSWORD_t user;  
    while (fscanf(fp, "%s %s", user.account_pri, user.password_pri) == 2) {  
        if (strcmp(user.account_pri,  username) == 0 && 
            strcmp(user.password_pri, password) == 0) {  
            fclose(fp);  
            return 1; // 登录成功  
        }  
    }  
  
    fclose(fp);  
    return 0; // 登录失败  
}  

//读取文件并创建节点
// void readFromFileAndAddToList(const char *filename) {  
//     FILE *fp = fopen(filename, "r");  
//     if (!fp) {  
//         perror("Error opening file");  
//         return;  
//     }   
//     DNode_t *newNode;  
//     char line[MAX_ACCOUNT + MAX_PASSWORD + 2]; // 假设每行格式是"account password\n"  
//     while (fgets(line, sizeof(line), fp)) {  //从文件中读取字符串
//         // 移除可能的换行符  
//         line[strcspn(line, "\n")] = 0; //返回字符串中连续不含指定内容的字符串  
//         // 假设账号和密码之间用空格分隔  
//         char *token = strtok(line, " "); //分割字符串 
//         if (token && strlen(token) < MAX_ACCOUNT) {  
//             strcpy(newNode->data.account_pri, token);  
//             token = strtok(NULL, " ");  
//             if (token && strlen(token) < MAX_PASSWORD) {  
//                 strcpy(newNode->data.password_pri, token);  
//                 // 创建新节点并添加到链表尾部  
//                 newNode = (DNode_t*)malloc(sizeof(DNode_t));  
//                 if (!newNode) {  
//                     perror("Memory allocation failed");  
//                     fclose(fp);  
//                     return;  
//                 }  
//                 // 初始化新节点的prev和next指针  
//                 newNode->prev = dir_tail;  
//                 newNode->next = NULL;   
//                 // 如果是第一个节点，需要特殊处理  
//                 if (!dir_head) {  
//                     dir_head = newNode;  
//                 } else {  
//                     dir_tail->next = newNode;  
//                 }  
//                 // 更新尾指针  
//                 dir_tail = newNode;  
//                 // 如果链表现在是双向循环的，需要设置头节点的prev指向尾节点  
//                 if (dir_head == dir_tail) {  
//                     dir_head->prev = dir_tail;  
//                     dir_tail->next = dir_head;  
//                 } else {  
//                     dir_tail->prev->next = newNode;  
//                 }  
//             }  
//         }  
//     }  
//     fclose(fp);  
// }  


//读取文件并写入链表中
void readFromFileAndAddToList(DNode_t*head){
    FILE *fp = fopen("./user_info/users.txt","r");
    if(fp == NULL)
    {
        perror("fopen");
        return ;
    }
    ACCOUNT_PASSWORD_t data;
    while(1)
    {
        char user_account[6] = {0};
        char user_password[6] = {0};
        //从指定的文件fp(./user_info/users.txt)中 获取指定格式  %s  %s  存储到用户的内存空间
        int ret = fscanf(fp,"%s %s",user_account,user_password);
        strcpy(data.account_pri,user_account);
        strcpy(data.password_pri,user_password);
        //printf("ret:%d name = %s, age = %d\n",ret,name,age);
        list_insert_tail(head ,data);
        //如果读取到文件末尾，则退出循环   feof 如果到达末尾了，则返回 非0 
        if(feof(fp))
        {
            break;
        }
    }
    fclose(fp);
}

//读取截图文件加到链表中
DScreenShotNode_t* dir_searchToList(const char*dirName,const char*suffix)
{
    //创建一条链表
    DScreenShotNode_t*list = list_ps_init();

    //1、打开目录文件
    DIR *dir = opendir(dirName);
    if(dir == NULL) {
        perror("opendir");
        return NULL;
    }
    //2、读取目录中的目录项
    while(1)
    {
        struct dirent *info = readdir(dir);
        if(info == NULL) {
            break;
        }
        if(info->d_type == DT_REG)//判断是一个普通文件
        {
            //判断文件名后缀
            int len = strlen(info->d_name);
            if(info->d_name[len-4] == suffix[0] &&
               info->d_name[len-3] == suffix[1] &&
               info->d_name[len-2] == suffix[2] &&
               info->d_name[len-1] == suffix[3])
            {
                //printf("i-node:%lu 文件类型:%hhu 文件名:%s\n",info->d_ino,info->d_type,info->d_name);  
                char pathName[1024] = {0};
                sprintf(pathName,"%s/%s",dirName,info->d_name);
                printf("文件名:%s\n",pathName);

                //插入链表中
                DElemType_t data;
                memset(&data,0,sizeof(data));
                strcpy(data.fileName,pathName);

                list_ps_insert_tail(list,data);
            }  
        }
    }

    //3、关闭目录文件
    closedir(dir);

    //list_show(list);

    return list;
}
